<?php
/**
 * スケジュールコンポーネントクラスモジュール
 */
require_once 'Smarty/Components/checkbox.php';
require_once 'Smarty/Components/table.php';
require_once 'Smarty/Components/hidden.php';
require_once 'Smarty/Components/anchor.php';
require_once 'Smarty/Components/thickbox.php';
require_once 'Cookie/Name.php';
require_once dirname(__FILE__) . '/Mapper.php';
require_once dirname(__FILE__) . '/../DateSelect/DateSelect.php';

/**
 * スケジュールコンポーネントクラス
 * Enter description here ...
 * @author admin
 *
 */
class Components_Calendar_Line extends Smarty_Components
{
	/** テンプレートファイル名 */
	const TEMPLATE_NAME = 'Line.tpl';
	/** スタイルクラス名プレフィックス（スケジュールテーブル） */
	const STYLECLASSNAME_SCHDULETABLE = 'tbl';
	/** スタイルクラス名プレフィックス（スケジュールトラックヘッダ） */
	const STYLECLASSNAME_SCHEDURETRACKHEADER = 'trkhdr';
	/** スタイルクラス名プレフィックス（スケジュールトラック偶数） */
	const STYLECLASSNAME_SCHEDULETRACKODD = 'trkodd';
	/** スタイルクラス名プレフィックス（スケジュールトラック奇数） */
	const STYLECLASSNAME_SCHEDULETRACKEVEN = 'trkeven';
	/** ＪＡＶＡＳＣＲＩＰＴ関数名：クリックイベント（学年チェックボックス） */
	const FUNCTIONNAMEEVENTCLICKAGE = 'EventClickAge';
	/** コントロールネーム：学年選択チェックボックス */
	const NAME_AGE_CHECKBOX = 'AGE';
	/** クッキーネーム：学年選択状態保存用クッキー */
	const NAME_COOKIE_AGE = 'CKAGE';
	/** 学校種別：小学校 */
	const JUNIOR_SCHOOL = 'junior_school';
	/** 学校種別：中学校 */
	const MIDDLE_SCHOOL = 'middle_school';
	/** 学校種別 ：高校*/
	const HIGH_SCHOOL = 'high_school';

	/** プレコンパイルフォルダー */
	protected $_sCompileDir;
	/** プレコンパイルファイル名プレフィックス */
	protected $_sCompileId;

	/** コンポーネントクラス：学年選択チェックボックス */
	protected $_objAgeCheckbox;
	/** コンポーネントクラス：スケジュールテーブル */
	protected $_objScheduleTable;
	/** コンポーネントクラス：ＨＩＤＤＥＮブロック  */
	protected $_objHidden;
	/** コンポーネントクラス：オーバーレイ */
	protected $_objOverlay;
	/** コンポーネントクラス：月移動リンク */
	protected $_objMonthLink;
	/** クッキークラス：学年選択状態保存 */
	protected $_objCookieAge;

	/** スタイルクラス名：スケジュールテーブル */
	public $StyleClassName_SchduleTable;
	/** スタイルクラス名：スケジュールトラックヘッダ */
	public $StyleClassName_SchedureTrackHeader;
	/** スタイルクラス名：スケジュールトラック偶数 */
	public $StyleClassName_ScheduleTrackOdd;
	/** スタイルクラス名：スケジュールトラック奇数 */
	public $StyleClassName_SchedulreTrackEven;
	/** ＪＡＶＡＳＣＲＩＰＴ関数名：クリックイベント（学年選択チェックボックス） */
	public $FunctionNameEventClickAge;

	/**
	 * コンストラクタ
	 * Enter description here ...
	 * @param string $sCompileId 中間ファイル名プレフィックス
	 * @param string $aryAgeOpthions 学年選択オプション
	 * @param string $sSelectedAgeValue 学年選択値
	 */
	public function __construct(
		$sCompileId,
		$KindSchol)
	{
		/** 中間ファイル生成フォルダー */
		$sCompileDir = dirname(__FILE__).'/../../data/templates_c';

		$this->_sCompileDir = $sCompileDir;
		$this->_sCompileId = $sCompileId;

		/** 親呼び出し */
		parent::__construct(dirname(__FILE__), $sCompileDir, $sCompileId);

		 /** スタイルクラス名初期化 */
		$this->_setNameStyleClass();

		/** ＪＡＶＡＳＣＲＩＰＴ関数名初期化 */
		$this->_setNameJavascriptFunction();

		 /** 学年選択チェックボックスコンポーネントクラス初期化		 */
		$this->_initAgeCheckboxClass($KindSchol);

		 /** スケジュールＴＡＢＬＥコンポーネントクラス初期化		 */
		$this->_initScheduleTableClass();

		/** 学年選択フォームＨＩＤＤＥＮコンポーネントクラス初期化 */
		$this->_initHiddenAgeSelectForm();

		/** オーバーレイコンポーネントクラス初期化 */
		$this->_initOverlay();

		/** 月移動リンクコンポーネントクラス初期化 */
		$this->_objMonthLink = new Components_DateSelect($sCompileId);
	}

	/**
	 * 学年選択オプション追加
	 * Enter description here ...
	 * @param unknown_type $aryAgeOption
	 */
	public function addAgeOption($aryAgeOption)
	{
		array_merge($this->_objAgeCheckbox->aryOptions, $aryAgeOption);
	}

	/**
	 * 学年選択オプション設定
	 * Enter description here ...
	 * @param unknown_type $aryAgeOptions
	 */
	public function setAgeOptions($KindSchol)
	{
		$this->_objAgeCheckbox->aryOptions
		= $this->_initAgeOptions($KindSchol);
	}

	/**
	 * 学年選択値設定
	 * Enter description here ...
	 * @param unknown_type $sSelectedValue
	 */
	public function setSelectedAgeOption($sSelectedValue)
	{
		$this->_objAgeCheckbox->sSelected = $sSelectedValue;
	}

	/**
	 * スケジュールデータ追加
	 * Enter description here ...
	 * @param unknown_type $sAge 学年
	 * @param unknown_type $sDate 日付
	 * @param unknown_type $sTime 集合時間
	 * @param unknown_type $sPlace 集合場所
	 * @param unknown_type $bGame 試合有無
	 */
	public function addSchedule($sAge,$sDate,$sTime,$sPlace,$sKind, $sNotice='－')
	{
		/*** 試合有無フラグ置換 */
		if ( $sKind === 'game' ) {
			$bGame = '○';
		}else{
			$bGame = '－';
		}
		$this->_objScheduleTable->TableDataset[]
		=array($sAge,$sDate,$sTime,$sPlace,$bGame,$sNotice);
	}

	/**
	 * (non-PHPdoc)
	 * @see Smarty_Components::fetch()
	 */
	public function fetch()
	{
		/*** テンプレート通知：スケジュールスタイル名 */
		$this->_sendScheduleStyleNameToTemplate();
		/*** テンプレート通知：Javascript関数名 */
		$this->_sendJavascriptFunctionNameToTemplate();

		$this->view->Checkbox_Age = $this->_objAgeCheckbox->fetch();
		$this->view->Table_LineCalendar = $this->_objScheduleTable->fetch();
		$this->view->HiddenBlock = $this->_objHidden->fetch();
		$this->view->MonthSelect = $this->_objMonthLink->fetch();
		$sHtml = parent::fetch(self::TEMPLATE_NAME);
		return $sHtml;
	}

	/**
	 * コンパイルフォルダーを返す
	 * Enter description here ...
	 */
	public function getCompileDir()
	{
		return $this->_sCompileDir;
	}

	/**
	 * 詳細ページＵＲＬ作成
	 * Enter description here ...
	 * @param unknown_type $Id
	 */
	public function createDetailUrl($Id)
	{
		$sResult = 'detail/?id='.$Id;
		return $sResult;
	}

	/**
	 * スタイルクラス名設定
	 * Enter description here ...
	 */
	protected function _setNameStyleClass()
	{
		/** スケジュールテーブル用スタイルクラス名 */
		$this->StyleClassName_SchduleTable
		= self::STYLECLASSNAME_SCHDULETABLE . $this->_sCompileId;
		/** スケジュールトラックヘッダスタイル用クラス名 */
		$this->StyleClassName_SchedureTrackHeader
		= self::STYLECLASSNAME_SCHEDURETRACKHEADER . $this->_sCompileId;
		/** スケジュールテーブルトラック偶数用クラス名 */
		$this->StyleClassName_ScheduleTrackOdd
		= self::STYLECLASSNAME_SCHEDULETRACKODD . $this->_sCompileId;
		/** スケジュールテーブルトラック奇数用クラス名 */
		$this->StyleClassName_SchedulreTrackEven
		= self::STYLECLASSNAME_SCHEDULETRACKEVEN . $this->_sCompileId;
	}

	/**
	 * JAVASCRIPT関数名設定
	 */
	protected function _setNameJavascriptFunction()
	{
		/** 学年選択チェックボックスクリックイベント関数名 */
		$this->FunctionNameEventClickAge = self::FUNCTIONNAMEEVENTCLICKAGE;
	}

	/**
	 * スケジュールＴＡＢＬＥコンポーネントクラス初期化
	 */
	protected function _initScheduleTableClass()
	{
		$this->_objScheduleTable
		= new Smarty_Components_Table($this->_sCompileDir, $this->_sCompileId);
		/*** テーブル属性設定 */
		$this->_objScheduleTable->TableAttrList[]
		= array("name"=>'class', "value"=>$this->StyleClassName_SchduleTable);
		/*** トラックヘッダ属性設定 */
		$this->_objScheduleTable->TrThAttrList[]
		= array(
					"name"=>"class",
					"value"=>$this->StyleClassName_SchedureTrackHeader
		);
		/*** トラック（偶数）属性設定 */
		$this->_objScheduleTable->OddTrAttrList[]
		= array(
					"name"=>"class",
					"value"=>$this->StyleClassName_ScheduleTrackOdd
		);
		/*** トラック（奇数）属性設定 */
		$this->_objScheduleTable->EvenTrAttrList[]
		= array(
					"name"=>"class",
					"value"=>$this->StyleClassName_SchedulreTrackEven
		);
		/*** トラックヘッダデータ設定 */
		$this->_objScheduleTable->ThDataset
		= array(
					'学年','日付','集合時間','場所','試合','連絡事項'
		);

		/*** スケジュールデータ設定 */
		$this->_MapSchedule();
	}

	/**
	 * スケジュールデータマッピング
	 * Enter description here ...
	 */
	protected function _MapSchedule()
	{
		/** オーバーレイコンポーネントクラス初期化 */
		$objNoticeOverlay
		= new Smarty_Components_Thickbox($this->_sCompileDir, $this->_sCompileId);
		/** マッパークラス初期化 */
		$objDatasetScedule = new Components_Calendar_Mapper();
		$aryDatasetScedule = $objDatasetScedule->get($this->_getAgeForMap());
		/** スケジュールデータ設定 */
		$aryScheduleViewList = array();
		foreach ($aryDatasetScedule['LIST'] as $ScheduleInfo) {
			/** 集合場所アンカータグ作成 */
			$sPlaceTag
			= $this->_createPlaceViewHtml(
				$ScheduleInfo['PLACE_INFO']['NAME'],
				$ScheduleInfo['PLACE_INFO']['MAPURL']);
			/** 集合時刻アンカータグ作成 */
			$sTimeTag
			= $this->_createTimeViewHtml(
				$ScheduleInfo['TIME_VIEW'],
				$ScheduleInfo['ID']);
			/** 連絡事項アンカータグ（オーバーレイ）作成 */
			if ($ScheduleInfo['NOTICE'] !=  '－') {
				$sNoticeTag = $objNoticeOverlay->fetch(
					'/Schedule/notice',200,100,'有り','&ID='.$ScheduleInfo['ID'].'&ymd='.$_REQUEST['ymd']
				);
			} else {
				$sNoticeTag =  '－';
			}
			/** スケジュールデータ設置 */
			$this->addSchedule(
				$ScheduleInfo['AGE_VIEW'],
				$ScheduleInfo['MONTH'].'月'.$ScheduleInfo['DAY'].'日（'.$ScheduleInfo['DAY_OF_WEEK'].'）',
				$sTimeTag,
				$sPlaceTag,
				$ScheduleInfo['KIND'],
				$sNoticeTag
			);
		}
	}

	/**
	 * 集合時刻のアンカータグ作成（詳細ページへのリンク）
	 * Enter description here ...
	 * @param unknown_type $sTimeView
	 * @param unknown_type $Id
	 */
	protected function _createTimeViewHtml($sTimeView, $Id)
	{
		return $sTimeView;
		$sUrl = $this->createDetailUrl($Id);
		$objA = new Smarty_Components_Anchor(
			$this->_sCompileDir,
			$this->_sCompileId,
			$sUrl,$sTimeView);
		$sHtml = $objA->fetch();
		return $sHtml;
	}

	/**
	 * 集合場所のアンカータグを作成する
	 * Enter description here ...
	 * @param unknown_type $sName
	 * @param unknown_type $sUrl
	 */
	protected function _createPlaceViewHtml($sName, $sUrl)
	{
		$objA = new Smarty_Components_Anchor(
			$this->_sCompileDir,
			$this->_sCompileId,
			$sUrl,$sName,
			'map'
		);
		$sHtml = $objA->fetch();
		return $sHtml;
	}

	/**
	 * リクエストからスケジュールデータ用フィルタ年齢リストを取得する
	 * Enter description here ...
	 * @param unknown_type $aryAgeList
	 * @return string|multitype:Ambigous <string>
	 */
	protected function _getAgeForMap($aryAgeList="")
	{
		if ( $aryAgeList == "" ) {
			if ( empty($_REQUEST[self::NAME_AGE_CHECKBOX]) ) {
				return "";
			}
			if ( is_array($_REQUEST[self::NAME_AGE_CHECKBOX])) {
				$aryAgeList = $_REQUEST[self::NAME_AGE_CHECKBOX];
			}
		}
		$aryAgeDictionary
		= array(
					'07'=>'U7',
					'08'=>'U8',
					'09'=>'U9',
					'10'=>'U10',
					'11'=>'U11',
					'12'=>'U12',
					'13'=>'U13',
					'14'=>'U14',
					'15'=>'U15',
					'16'=>'U16',
					'17'=>'U17',
					'18'=>'U18',
		);
		$aryResult = array();
		foreach ($aryAgeList as $sAge) {
			if ( !isset($aryAgeDictionary[$sAge] ) ) {
				continue;
			}
			$aryResult[] = $aryAgeDictionary[$sAge];
		}
		return $aryResult;
	}

	/**
	 * 学年選択チェックボックスコンポーネントクラス初期化
	 */
	protected function _initAgeCheckboxClass($KindSchol)
	{
		/** クッキークラス：学年選択状態初期化 */
		$this->_initAgeCookie();
		/** チェックボックスコンポーネントクラス */
		$this->_objAgeCheckbox
		= new SmartyComponents_Checkbox(
			$this->_sCompileDir,
			$this->_sCompileId,
			self::NAME_AGE_CHECKBOX);
		$this->setAgeOptions($KindSchol);
		$this->_objAgeCheckbox->sSeparator = ' ';
		$this->_objAgeCheckbox->onClick = $this->FunctionNameEventClickAge . '(this);';
		$this->_setAgeSelected();
	}

	/**
	 * 学年選択状態保存クッキークラス初期化
	 * Enter description here ...
	 */
	protected function _initAgeCookie()
	{
		$this->_objCookieAge = new Lib_Cookie_Name(self::NAME_COOKIE_AGE, 12);
	}

	/**
	 * 学年選択オプション設定
	 * Enter description here ...
	 * @param unknown_type $Kind
	 */
	protected function _initAgeOptions($SchoolKind)
	{
		$aryAgeOptions = array();
		switch	($SchoolKind) {
			case self::JUNIOR_SCHOOL:
				$aryAgeOptions
				= array(
					'07'=>'１年生',
					'08'=>'２年生',
					'09'=>'３年生',
					'10'=>'４年生',
					'11'=>'５年生',
					'12'=>'６年生',
				);
				break;
			case self::MIDDLE_SCHOOL:
				$aryAgeOptions
				= array(
					'13'=>'１年生',
					'14'=>'２年生',
					'15'=>'３年生',
				);
				break;
			case self::HIGH_SCHOOL:
				$aryAgeOptions
				= array(
					'16'=>'１年生',
					'17'=>'２年生',
					'18'=>'３年生',
				);
				break;
		}
		return $aryAgeOptions;
	}

	/**
	 * 学年選択フォームＨＩＤＤＥＮブロック初期化
	 */
	protected function _initHiddenAgeSelectForm()
	{
		$this->_objHidden = new SmartyComponents_Hidden(
			$this->_sCompileDir,
			$this->_sCompileId
		);

		foreach ($_REQUEST as $Key=>$Value) {
			switch ($Key) {
				case self::NAME_AGE_CHECKBOX:
				case self::NAME_COOKIE_AGE:
					break;
				default:
					$this->_objHidden->addInfo($Key,$Value);
			}
		}
	}

	/**
	 * テンプレート通知：スケジュールスタイル名
	 */
	protected function _sendScheduleStyleNameToTemplate()
	{
		$this->view->StyleClassName_SchduleTable = $this->StyleClassName_SchduleTable;
		$this->view->StyleClassName_SchedureTrackHeader = $this->StyleClassName_SchedureTrackHeader;
		$this->view->StyleClassName_ScheduleTrackOdd = $this->StyleClassName_ScheduleTrackOdd;
		$this->view->StyleClassName_SchedulreTrackEven = $this->StyleClassName_SchedulreTrackEven;
	}

	/**
	 * テンプレート通知：ＪＡＶＡＳＣＲＩＰＴ関数名
	 */
	protected function _sendJavascriptFunctionNameToTemplate()
	{
		$this->view->FunctionNameEventClickAge
		= $this->FunctionNameEventClickAge;
	}

	/**
	 * Requestにより学年の選択状態を設定する
	 */
	protected function _setAgeSelected()
	{
		/*** クッキーデータ文字列初期化 */
		$sCookieValue = '';

		/**
		 * リクエストチェック
		 * フォームリクエスト設定されている場合、これを優先する
		 * そうでない場合、クッキーの設定内容による
		 */
		if ( isset ( $_REQUEST[self::NAME_AGE_CHECKBOX]) ) {
			/** 配列判定 */
			if  (is_array($_REQUEST[self::NAME_AGE_CHECKBOX]) ) {
				/*** 学年選択チェックボックスにチェックを設置 */
				$this->setSelectedAgeOption($_REQUEST[self::NAME_AGE_CHECKBOX]);
				/*** クッキーデータ文字列設定 */
				$sCookieValue = implode(",", $_REQUEST[self::NAME_AGE_CHECKBOX]);
			} else {
				/*** 学年選択チェックボックスにチェックを設置 */
				$this->setSelectedAgeOption($_REQUEST[self::NAME_AGE_CHECKBOX]);
				/*** クッキーデータ文字列設定 */
				$sCookieValue = $_REQUEST[self::NAME_AGE_CHECKBOX];
			}
			/*** 選択状態保存クッキークリア */
			$this->_objCookieAge->deleteCookie();
			$this->_objCookieAge->setValue($sCookieValue);
		} else {
			/** クッキーチェック */
			if ( $this->_objCookieAge->getValue() != '' ) {
				$aryValue = explode(',', $this->_objCookieAge->getValue());
				$this->setSelectedAgeOption($aryValue);
				$_REQUEST[self::NAME_AGE_CHECKBOX] = $aryValue;
			}
		}
	}

	protected function _initOverlay()
	{
		$objThickbox = new Smarty_Components_Thickbox($this->_sCompileDir, $this->_sCompileId);
		$this->view->OVERLAY_ANCHOR = $objThickbox->fetch('/img/001.jpg', 300,400,'TEXT');
//		$this->view->CSS_OVERLAY = $objThickbox->fetchCss();
//		$this->view->JS_OVERLAY = $objThickbox->fetchJs();
	}
}